//
//  EmoticonPackage.m
//  XinLang_OC
//
//  Created by WONG on 16/4/23.
//  Copyright © 2016年 cheuhui. All rights reserved.
//

#import "EmoticonPackage.h"
#import "Emoticon.h"



@interface EmoticonPackage ()


@end


@implementation EmoticonPackage

- (instancetype)initWithId:(NSString *)id {
    if(self = [super init]) {
        self = [[EmoticonPackage alloc] init];
        self.id = id;
    }
    return self;
}

+ (instancetype)initWithId:(NSString *)id {
    return [[EmoticonPackage alloc] initWithId:id];
}


// 字典的key在模型中找不到对应的属性, 特别注意 不要写错方法
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {}

- (NSString *)description {
    return [NSString stringWithFormat:@"id = %@; group_name_up = %@; emoticons = %@",self.id, self.group_name_cn, self.emoticons];
}

#warning 静态属性,保存表情包模型数据, 只会加载一次
static NSMutableArray *packagess = nil;

/**
 *  加载表情包
 */
+ (NSArray *)loadPackages {
    
    if (packagess) {
        return packagess;
    }
    
    NSString *plistPath = [bundlePath stringByAppendingPathComponent:@"emoticons.plist"];
    
    // 获取emoticons.plist内容
    NSDictionary *emoticonsDict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
    
    // 获取表情包文件夹名称 [Int] [[String: AnyObject]]: 数组里面的元素是字典
    NSArray *packageArr = emoticonsDict[@"packages"];
    
    // 存放表情包模型的数组
    NSMutableArray<EmoticonPackage *> *packages = [NSMutableArray array];
    
    // 创建“最近”表情包
    EmoticonPackage *recentPackage = [EmoticonPackage initWithId:@""];
    
    // 设置表情包名称
    recentPackage.group_name_cn = @"最近";
    
    // 追加20个空表情和一个删除按钮
    [recentPackage appendEmptyEmoticon];
    
    // 添加到表情包
    [packages addObject:recentPackage];
    
    // 从Emoticons.bunble里面加载出来的
    // 遍历获取每一个表情包文件名称
    for (NSDictionary *dict in packageArr) {
        // 获取id
        NSString *id = dict[@"id"];
        
        // 创建表情包
        EmoticonPackage *package = [EmoticonPackage initWithId:id];
        
        // 根据当前表情包模型，加载表情包名称和所有的表情模型
        [package loadEmoticon];
        
        [packages addObject:package];
        
        
    }
    packagess = packages;
    return packages;
}

// 根据当前表情包模型，加载表情包名称和所有的表情模型
- (void)loadEmoticon {
    // 获取对应表情包模型里面的info.plist = bundlePath + 表情包文件夹名称 + info.plist
    NSString *infoPlist = [bundlePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@/info.plist",self.id]];
    
    // 把info.plist的内容加载到内存
    NSDictionary *infoDict = [[NSDictionary alloc] initWithContentsOfFile:infoPlist];
    
    // 获取表情包的名称
    self.group_name_cn = infoDict[@"group_name_cn"];
    
    // 获取表情包里面所有的模型
    NSArray *emoticonArr = infoDict[@"emoticons"];
    
    // 记录
    NSInteger index = 0;
    
    // 遍历emoticonArr数组，生成表情模型
    for (NSDictionary *dict in emoticonArr) {
        // 字典转模型创建表情的时候,把表情包文件夹名称也传入进来
        Emoticon *emoticon = [Emoticon initWithId:self.id dict:dict];
        
        [self.emoticons addObject:emoticon];
        
        index++;
        
        // 判断，如果是每一页的最后一个，添加一个删除按钮
        if (index == 20) {
            // 创建删除按钮
            Emoticon *removeEmoticon = [Emoticon initWithRemoveEmoticon:YES];
            // 添加到表情模型数组
            [self.emoticons addObject:removeEmoticon];
            // 清空index
            index = 0;
        }
    }
    // 表情包加载完成,来判断这个表情包最后一页,是否够21格按钮.不够的话,填充空白按钮,并在最后添加一个删除按钮
    [self appendEmptyEmoticon];
}

/// 填充空白按钮,并在最后添加一个删除按钮
- (void)appendEmptyEmoticon {
    // 判断,这个表情包最后一页有多少个按钮
    NSInteger count = self.emoticons.count % 21; // count == 0 正好满一页
    
    // 当是 `最近` 表情包时, emoticons.count 数量是等于0, count也等于0,进入不了追加表情,从bundle加载的表情 emoticons.count不等于0
    // emoticons.count == 0表示`最近` 表情包
    if (count > 0 || self.emoticons.count == 0) {
        // 表示最后一页没有满21个,只有count个
        // 追加多少个空白按钮
        // count == 1, 需要追加19(20 - 1)(count..<20)个空白按钮和一个删除按钮
        // count == 2, 需要追加18(20 - 2)(count..<20)个空白按钮和一个删除按钮
        
        // 追加按钮
        for (int i = 0; i < (20 - count); i++) {
            // 创建空白按钮模型
            Emoticon *emptyEmoticon = [Emoticon initWithRemoveEmoticon:false];
            
            [self.emoticons addObject:emptyEmoticon];
        }
        // 追加一个删除按钮
        [self.emoticons addObject:[Emoticon initWithRemoveEmoticon:true]];
    }
}

/**
 将表情添加到 `最近` 表情包
 
 - parameter emoticon: 要添加的表情模型
 */
- (void)addFavorate:(Emoticon *)emoticon {
    // 如果是删除按钮就不需要添加
    if (emoticon.removeEmoticon) {
        return;
    }
    
    // 如果是空白按钮不需要添加, 空白按钮即没有图片,也没有emoji
    if (emoticon.pngPath == nil && emoticon.emoji == nil) {
        return;
    }
    
    emoticon.times ++;
    
    // 获取最近表情包所有表情模型
    EmoticonPackage *recentPackage = packagess[0];
    NSMutableArray<Emoticon *> *recentEmoticons = recentPackage.emoticons;
    
    // 删除按钮不需要排序,先讲删除从数组中移除,在排完序之后,在添加回去
    [recentEmoticons removeLastObject];
    
    // 如果 `最近` 表情包 已经包含这个模型 不需要再添加
    BOOL contains = [recentEmoticons containsObject:emoticon];
    
    // 不再表情包里面,才需要添加
    if (!contains) {
        [recentEmoticons addObject:emoticon];
//        [recentEmoticons insertObject:emoticon atIndex:0];
    }
    
    // 使用次数多得排在前面,对数组里面的所有元素排序,需要将排序后的数组重新赋值给 recentEmoticons
    // 降序 obj1.times(int类型)
    NSArray *sortEmoticons = [recentEmoticons sortedArrayUsingComparator:^NSComparisonResult(Emoticon *obj1, Emoticon *obj2) {

        if (obj1.times > obj2.times) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        if (obj1.times < obj2.times) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];

    NSMutableArray *mutableSortEmoticons = [NSMutableArray arrayWithArray:sortEmoticons];
    
    // 如果前面有往最近表情模型数组添加表情模型,为了保证永远只有21个,需要删除,排序后数组最后一个模型
    if (!contains) {
        // 移除最后一个
        [mutableSortEmoticons removeLastObject];
    }

    // 将删除按钮添加回去
    [mutableSortEmoticons addObject:[Emoticon initWithRemoveEmoticon:YES]];
    
    NSLog(@"sortEmoticons = %zd",mutableSortEmoticons.count);
    // 赋值回去,千万要记得赋值回去
    EmoticonPackage *package = packagess[0];
    package.emoticons = mutableSortEmoticons;
}



#pragma mark - lazy load

- (NSMutableArray<Emoticon *> *)emoticons {
    if (!_emoticons) {
        _emoticons = [NSMutableArray array];
    }
    return _emoticons;
}


@end











